package lesson04.作业.作业01;

import java.util.ArrayList;
import java.util.List;
/**
 * 第一个先等待再唤醒，第二个先唤醒然后再等待（notify并不能获得线程锁，只有执行了wait才能获得锁）
 *
 * 实现一个容器，提供两个方法，add，size
 * 写两个线程，线程1添加10个元素到容器中，线程2实现监控元素的个数，当个数到5个时，线程2给出提示并结束
 */
public class SynchronizedDemo {
    volatile List w  = new ArrayList<>();
    static  final  Object lock  = new Object();

    void add(Object o){
        w.add(o);
    }

    Integer size(){
        return w.size();
    }

    public static void main(String[] args) {
        SynchronizedDemo demo3 = new SynchronizedDemo();
        new Thread(()->{
            System.out.println("t2 start");
            synchronized (lock){
                if(demo3.size()!=5){
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("size 5.... t2 end");
                lock.notify();
            }
        },"t2").start();

        new Thread(()->{
            System.out.println("t1 start");
            for (int i = 0; i < 10; i++) {
                synchronized (lock){
                    if(demo3.size() == 5){
                        lock.notify();
                        try {
                            lock.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    demo3.add(new Object());
                    System.out.println(""+ i);

                }
            }
        },"t1").start();
    }
}
